package com.example.d8_stream;

import java.util.*;
import java.util.stream.Stream;

/**
 * Stream流的创建获取
 */
public class StreamTest2 {
    public static void main(String[] args) {
        // 1.如何获取List集合的Stream流?
        List<String> names = new ArrayList<>();
        Collections.addAll(names, "张三丰", "张无忌", "周芷若", "赵敏", "张强");
        // 获取stream流
        Stream<String> stream = names.stream();


        // 2.如何获取Set集合的Stream流?
        Set<String> set = new HashSet<>();
        Collections.addAll(set, "刘德华", "张曼玉", "蜘蛛精", "马德", "德玛西亚");
        // 获取stream流
        Stream<String> stream1 = set.stream();

        // 最原始的写法
//        stream1.filter(new Predicate<String>() {
//            @Override
//            public boolean test(String s) {
//                return s.contains("德");
//            }
//        }).forEach(new Consumer<String>() {
//            @Override
//            public void accept(String s) {
//                System.out.println(s);
//            }
//        });
        // 用lambda表达式简化  因为像filter forEach里面创建的都是一个匿名内部类 所以可以使用Lambda化简
        // stream1.filter(s -> s.contains("德")).forEach(s -> System.out.println(s));
        // 使用方法引用进行简化
        stream1.filter(s -> s.contains("德")).forEach(System.out::println);


        // 3.如何获取Map集合的Stream流?
        Map<String, Double> map = new HashMap<>();
        map.put("古力娜扎", 172.3);
        map.put("迪丽热巴", 168.3);
        map.put("马尔扎哈", 166.3);
        map.put("卡尔扎巴", 168.3);
        // map集合不能直接获取stream流 因为map集合没有stream方法

        // 第一种 先通过KeySet获取到所以的key 所有的key会放在一个set集合中 此时可以获取到stream流
        Set<String> key = map.keySet();
        Stream<String> ks = key.stream();

        // 先获取到所有的value 所有的值会放在一个Collection集合中 此时可以获取到stream流
        Collection<Double> values = map.values();
        Stream<Double> vs = values.stream();

        // 第二种 通过entrySet获取到所有的键值对对象 在获取stream流
        Set<Map.Entry<String, Double>> entries = map.entrySet();
        Stream<Map.Entry<String, Double>> kvs = entries.stream();
        // 通过stream流过滤并且遍历输出
        kvs.filter(s -> s.getKey().contains("巴")).forEach(s -> System.out.println(s.getKey() + "---" + s.getValue()));


        // 4.如何获取数组的Stream流?
        String[] names2 = {"张翠山", "东方不败", "唐大山", "独孤求败"};
        // 通过调用Arrays.stream(T[] a)方法获取
        Stream<String> s1 = Arrays.stream(names2);
        // 通过调用Stream.of(T... values)方法获取
        Stream<String> s2 = Stream.of(names2);
    }
}
